/**
 * 格式化日期函数
 * @param date 要格式化的日期，可以是 Date 对象、日期字符串或时间戳
 * @param format 日期格式字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export function formatDate(
  date,
  format = 'YYYY-MM-DD HH:mm:ss'
) {
  let targetDate;

  // 根据输入类型确定目标日期
  if (date instanceof Date) {
    targetDate = date;
  } else if (typeof date === 'string' || typeof date === 'number') {
    targetDate = new Date(date);
  } else {
    // 如果没有提供日期或日期无效，使用当前日期
    targetDate = new Date();
  }

  // 检查日期是否有效，如果无效则使用当前日期
  if (isNaN(targetDate.getTime())) {
    targetDate = new Date();
  }

  // 用于补零的辅助函数
  const pad = (num) => num.toString().padStart(2, '0');

  // 定义格式化标记及其对应的值
  const formatTokens = {
    YYYY: () => targetDate.getFullYear().toString(), // 四位年份
    YY: () => targetDate.getFullYear().toString().slice(-2), // 两位年份
    MM: () => pad(targetDate.getMonth() + 1), // 两位月份（01-12）
    M: () => (targetDate.getMonth() + 1).toString(), // 一位月份（1-12）
    DD: () => pad(targetDate.getDate()), // 两位日期（01-31）
    D: () => targetDate.getDate().toString(), // 一位日期（1-31）
    HH: () => pad(targetDate.getHours()), // 两位小时，24小时制（00-23）
    H: () => targetDate.getHours().toString(), // 一位小时，24小时制（0-23）
    hh: () => pad(targetDate.getHours() % 12 || 12), // 两位小时，12小时制（01-12）
    h: () => (targetDate.getHours() % 12 || 12).toString(), // 一位小时，12小时制（1-12）
    mm: () => pad(targetDate.getMinutes()), // 两位分钟（00-59）
    m: () => targetDate.getMinutes().toString(), // 一位分钟（0-59）
    ss: () => pad(targetDate.getSeconds()), // 两位秒（00-59）
    s: () => targetDate.getSeconds().toString(), // 一位秒（0-59）
    SSS: () => targetDate.getMilliseconds().toString().padStart(3, '0'), // 三位毫秒（000-999）
    A: () => (targetDate.getHours() < 12 ? 'AM' : 'PM'), // 大写上午/下午
    a: () => (targetDate.getHours() < 12 ? 'am' : 'pm') // 小写上午/下午
  };

  // 使用正则表达式替换格式字符串中的标记
  return format.replace(/\b(?:YYYY|YY|MM|M|DD|D|HH|H|hh|h|mm|m|ss|s|SSS|A|a)\b/g, (match) => {
    const replacer = formatTokens[match];
    return replacer ? replacer() : match;
  });
}
/**
 * 格式化日期函数,完全定制
 * @param date 要格式化的日期，可以是 Date 对象、日期字符串或时间戳
 * @param format 日期格式字符串，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export function strangeFormatDate(
  date,
  format = 'yyyy-MM-dd hh:mm:ss'
) {
  let targetDate;

  // 根据输入类型确定目标日期
  if (date instanceof Date) {
    targetDate = date;
  } else if (typeof date === 'string' || typeof date === 'number') {
    targetDate = new Date(date);
  } else {
    // 如果没有提供日期或日期无效，使用当前日期
    targetDate = new Date();
  }

  // 检查日期是否有效，如果无效则使用当前日期
  if (isNaN(targetDate.getTime())) {
    targetDate = new Date();
  }

  // 用于补零的辅助函数
  const pad = (num) => num.toString().padStart(2, '0');

  // 定义格式化标记及其对应的值
  const formatTokens = {
    yyyy: () => targetDate.getFullYear().toString(), // 四位年份
    yy: () => targetDate.getFullYear().toString().slice(-2), // 两位年份
    MM: () => pad(targetDate.getMonth() + 1), // 两位月份（01-12）
    M: () => (targetDate.getMonth() + 1).toString(), // 一位月份（1-12）
    dd: () => pad(targetDate.getDate()), // 两位日期（01-31）
    d: () => targetDate.getDate().toString(), // 一位日期（1-31）
    hh: () => pad(targetDate.getHours()), // 两位小时，24小时制（00-23）
    h: () => targetDate.getHours().toString(), // 一位小时，24小时制（0-23）
    mm: () => pad(targetDate.getMinutes()), // 两位分钟（00-59）
    m: () => targetDate.getMinutes().toString(), // 一位分钟（0-59）
    ss: () => pad(targetDate.getSeconds()), // 两位秒（00-59）
    s: () => targetDate.getSeconds().toString(), // 一位秒（0-59）
    SSS: () => targetDate.getMilliseconds().toString().padStart(3, '0'), // 三位毫秒（000-999）
    A: () => (targetDate.getHours() < 12 ? 'AM' : 'PM'), // 大写上午/下午
    a: () => (targetDate.getHours() < 12 ? 'am' : 'pm') // 小写上午/下午
  };

  // 使用正则表达式替换格式字符串中的标记
  return format.replace(/\b(?:yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|A|a)\b/g, (match) => {
    const replacer = formatTokens[match];
    return replacer ? replacer() : match;
  });
}
export function generateTimestampedUUID() {
  const timestamp = new Date().getTime();
  const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
    const r = (timestamp + Math.random() * 16) % 16 | 0;
    return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
  });
  return `${timestamp}-${uuid}`;
}